{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dpath ='./data/'\n",
    "train = pd.read_csv(dpath+\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1b258212d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(train.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies_0</th>\n",
       "      <th>Pregnancies_1</th>\n",
       "      <th>Pregnancies_2</th>\n",
       "      <th>Pregnancies_3</th>\n",
       "      <th>Pregnancies_4</th>\n",
       "      <th>Pregnancies_5</th>\n",
       "      <th>Pregnancies_6</th>\n",
       "      <th>Pregnancies_7</th>\n",
       "      <th>Pregnancies_8</th>\n",
       "      <th>Pregnancies_9</th>\n",
       "      <th>...</th>\n",
       "      <th>Age_63</th>\n",
       "      <th>Age_64</th>\n",
       "      <th>Age_65</th>\n",
       "      <th>Age_66</th>\n",
       "      <th>Age_67</th>\n",
       "      <th>Age_68</th>\n",
       "      <th>Age_69</th>\n",
       "      <th>Age_70</th>\n",
       "      <th>Age_72</th>\n",
       "      <th>Age_81</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 69 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies_0  Pregnancies_1  Pregnancies_2  Pregnancies_3  Pregnancies_4  \\\n",
       "0              0              0              0              0              0   \n",
       "1              0              1              0              0              0   \n",
       "2              0              0              0              0              0   \n",
       "3              0              1              0              0              0   \n",
       "4              1              0              0              0              0   \n",
       "\n",
       "   Pregnancies_5  Pregnancies_6  Pregnancies_7  Pregnancies_8  Pregnancies_9  \\\n",
       "0              0              1              0              0              0   \n",
       "1              0              0              0              0              0   \n",
       "2              0              0              0              1              0   \n",
       "3              0              0              0              0              0   \n",
       "4              0              0              0              0              0   \n",
       "\n",
       "    ...    Age_63  Age_64  Age_65  Age_66  Age_67  Age_68  Age_69  Age_70  \\\n",
       "0   ...         0       0       0       0       0       0       0       0   \n",
       "1   ...         0       0       0       0       0       0       0       0   \n",
       "2   ...         0       0       0       0       0       0       0       0   \n",
       "3   ...         0       0       0       0       0       0       0       0   \n",
       "4   ...         0       0       0       0       0       0       0       0   \n",
       "\n",
       "   Age_72  Age_81  \n",
       "0       0       0  \n",
       "1       0       0  \n",
       "2       0       0  \n",
       "3       0       0  \n",
       "4       0       0  \n",
       "\n",
       "[5 rows x 69 columns]"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#类别型\n",
    "categorical_feature = ['Pregnancies','Age']\n",
    "for col in categorical_feature:\n",
    "    train[col].value_counts()\n",
    "    train[col] = train[col].astype('object')\n",
    "x_train_cat = train[categorical_feature]\n",
    "x_train_cat = pd.get_dummies(x_train_cat)\n",
    "x_train_cat.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.743719</td>\n",
       "      <td>0.590164</td>\n",
       "      <td>0.353535</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.500745</td>\n",
       "      <td>0.234415</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.427136</td>\n",
       "      <td>0.540984</td>\n",
       "      <td>0.292929</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.396423</td>\n",
       "      <td>0.116567</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.919598</td>\n",
       "      <td>0.524590</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.347243</td>\n",
       "      <td>0.253629</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.447236</td>\n",
       "      <td>0.540984</td>\n",
       "      <td>0.232323</td>\n",
       "      <td>0.111111</td>\n",
       "      <td>0.418778</td>\n",
       "      <td>0.038002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.688442</td>\n",
       "      <td>0.327869</td>\n",
       "      <td>0.353535</td>\n",
       "      <td>0.198582</td>\n",
       "      <td>0.642325</td>\n",
       "      <td>0.943638</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Glucose  BloodPressure  SkinThickness   Insulin       BMI  \\\n",
       "0  0.743719       0.590164       0.353535  0.000000  0.500745   \n",
       "1  0.427136       0.540984       0.292929  0.000000  0.396423   \n",
       "2  0.919598       0.524590       0.000000  0.000000  0.347243   \n",
       "3  0.447236       0.540984       0.232323  0.111111  0.418778   \n",
       "4  0.688442       0.327869       0.353535  0.198582  0.642325   \n",
       "\n",
       "   DiabetesPedigreeFunction  \n",
       "0                  0.234415  \n",
       "1                  0.116567  \n",
       "2                  0.253629  \n",
       "3                  0.038002  \n",
       "4                  0.943638  "
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "ss_x = StandardScaler()\n",
    "num_feature = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI','DiabetesPedigreeFunction']\n",
    "temp = mn_x.fit_transform(train[num_feature])\n",
    "\n",
    "x_train_num = pd.DataFrame(data=temp, columns=numerical_features, index =train.index)\n",
    "x_train_num.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies_0</th>\n",
       "      <th>Pregnancies_1</th>\n",
       "      <th>Pregnancies_2</th>\n",
       "      <th>Pregnancies_3</th>\n",
       "      <th>Pregnancies_4</th>\n",
       "      <th>Pregnancies_5</th>\n",
       "      <th>Pregnancies_6</th>\n",
       "      <th>Pregnancies_7</th>\n",
       "      <th>Pregnancies_8</th>\n",
       "      <th>Pregnancies_9</th>\n",
       "      <th>...</th>\n",
       "      <th>Age_70</th>\n",
       "      <th>Age_72</th>\n",
       "      <th>Age_81</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.743719</td>\n",
       "      <td>0.590164</td>\n",
       "      <td>0.353535</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.500745</td>\n",
       "      <td>0.234415</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.427136</td>\n",
       "      <td>0.540984</td>\n",
       "      <td>0.292929</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.396423</td>\n",
       "      <td>0.116567</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.919598</td>\n",
       "      <td>0.524590</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.347243</td>\n",
       "      <td>0.253629</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.447236</td>\n",
       "      <td>0.540984</td>\n",
       "      <td>0.232323</td>\n",
       "      <td>0.111111</td>\n",
       "      <td>0.418778</td>\n",
       "      <td>0.038002</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.688442</td>\n",
       "      <td>0.327869</td>\n",
       "      <td>0.353535</td>\n",
       "      <td>0.198582</td>\n",
       "      <td>0.642325</td>\n",
       "      <td>0.943638</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 76 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies_0  Pregnancies_1  Pregnancies_2  Pregnancies_3  Pregnancies_4  \\\n",
       "0              0              0              0              0              0   \n",
       "1              0              1              0              0              0   \n",
       "2              0              0              0              0              0   \n",
       "3              0              1              0              0              0   \n",
       "4              1              0              0              0              0   \n",
       "\n",
       "   Pregnancies_5  Pregnancies_6  Pregnancies_7  Pregnancies_8  Pregnancies_9  \\\n",
       "0              0              1              0              0              0   \n",
       "1              0              0              0              0              0   \n",
       "2              0              0              0              1              0   \n",
       "3              0              0              0              0              0   \n",
       "4              0              0              0              0              0   \n",
       "\n",
       "    ...     Age_70  Age_72  Age_81   Glucose  BloodPressure  SkinThickness  \\\n",
       "0   ...          0       0       0  0.743719       0.590164       0.353535   \n",
       "1   ...          0       0       0  0.427136       0.540984       0.292929   \n",
       "2   ...          0       0       0  0.919598       0.524590       0.000000   \n",
       "3   ...          0       0       0  0.447236       0.540984       0.232323   \n",
       "4   ...          0       0       0  0.688442       0.327869       0.353535   \n",
       "\n",
       "    Insulin       BMI  DiabetesPedigreeFunction  Outcome  \n",
       "0  0.000000  0.500745                  0.234415        1  \n",
       "1  0.000000  0.396423                  0.116567        0  \n",
       "2  0.000000  0.347243                  0.253629        1  \n",
       "3  0.111111  0.418778                  0.038002        0  \n",
       "4  0.198582  0.642325                  0.943638        1  \n",
       "\n",
       "[5 rows x 76 columns]"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train = pd.concat([x_train_cat, x_train_num,train['Outcome']], axis = 1, ignore_index=False)\n",
    "x_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据集分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = x_train.drop([\"Outcome\"], axis=1)\n",
    "X_train = np.array(train)\n",
    "Y_train = x_train['Outcome'].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(614, 75)\n",
      "(614,)\n",
      "(154, 75)\n",
      "(154,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "x_train, x_test, y_train, y_test = train_test_split(X_train, Y_train, train_size = 0.8,random_state = 0)\n",
    "print x_train.shape\n",
    "print y_train.shape\n",
    "print x_test.shape\n",
    "print y_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LogisticRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
      "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
      "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
      "          verbose=0, warm_start=False):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.82      0.87      0.85       107\n",
      "          1       0.66      0.57      0.61        47\n",
      "\n",
      "avg / total       0.77      0.78      0.77       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[93 14]\n",
      " [20 27]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import  LogisticRegression\n",
    "from sklearn.metrics import confusion_matrix,classification_report\n",
    "\n",
    "lr = LogisticRegression()\n",
    "lr.fit(x_train,y_train)\n",
    "\n",
    "y_predict = lr.predict(x_test)\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (lr, classification_report(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % confusion_matrix(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "矩阵评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.56134636 0.48000636 0.50105344 0.56323015 0.52877476]\n",
      "cv logloss is: 0.5268822119027446\n"
     ]
    }
   ],
   "source": [
    "from sklearn.cross_validation import cross_val_score\n",
    "loss = cross_val_score(lr, x_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "print 'logloss of each fold is: ',-loss\n",
    "print'cv logloss is:', -loss.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00400863, 0.00226946, 0.00139866, 0.00200596, 0.00409045,\n",
       "        0.00220299, 0.01389294, 0.00280504, 0.03336763, 0.00350695,\n",
       "        0.17688684, 0.00436602, 0.39663835, 0.00572143]),\n",
       " 'mean_score_time': array([0.00160017, 0.00167799, 0.00154037, 0.00152583, 0.00169549,\n",
       "        0.00154843, 0.00171561, 0.00154533, 0.00168123, 0.00164461,\n",
       "        0.00165582, 0.00165954, 0.00153122, 0.00167079]),\n",
       " 'mean_test_score': array([-0.69314718, -0.67924407, -0.69314718, -0.646873  , -0.63822569,\n",
       "        -0.58264766, -0.50809872, -0.52687606, -0.59827846, -0.56710437,\n",
       "        -0.68059486, -0.63478329, -0.75864793, -0.69792174]),\n",
       " 'mean_train_score': array([-0.69314718, -0.67890814, -0.69314718, -0.64378926, -0.63483608,\n",
       "        -0.56202695, -0.44674222, -0.45209859, -0.39853538, -0.40337535,\n",
       "        -0.39495138, -0.39570138, -0.39467518, -0.39479859]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10, 10, 100,\n",
       "                    100, 1000, 1000],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'rank_test_score': array([11,  9, 11,  8,  7,  4,  1,  2,  5,  3, 10,  6, 14, 13],\n",
       "       dtype=int32),\n",
       " 'split0_test_score': array([-0.69314718, -0.67940081, -0.69314718, -0.64758415, -0.63540101,\n",
       "        -0.59066125, -0.55003491, -0.56134636, -0.72239966, -0.65259395,\n",
       "        -0.86189271, -0.77691867, -0.9902921 , -0.88756015]),\n",
       " 'split0_train_score': array([-0.69314718, -0.67885517, -0.69314718, -0.64326142, -0.62643115,\n",
       "        -0.55775686, -0.43726173, -0.44341719, -0.38499407, -0.39112057,\n",
       "        -0.38101973, -0.38188784, -0.38074542, -0.38087327]),\n",
       " 'split1_test_score': array([-0.69314718, -0.67876608, -0.69314718, -0.64373574, -0.64344999,\n",
       "        -0.56632516, -0.44869487, -0.48000636, -0.51586886, -0.49742003,\n",
       "        -0.58026906, -0.54617216, -0.63388488, -0.59020237]),\n",
       " 'split1_train_score': array([-0.69314718, -0.67920052, -0.69314718, -0.64545966, -0.64490925,\n",
       "        -0.56911662, -0.46083661, -0.4647365 , -0.41215151, -0.41683052,\n",
       "        -0.40848666, -0.40928238, -0.40819988, -0.40833314]),\n",
       " 'split2_test_score': array([-0.69314718, -0.67901536, -0.69314718, -0.64549846, -0.63597358,\n",
       "        -0.57465134, -0.48145139, -0.50105344, -0.51550846, -0.51138328,\n",
       "        -0.59939831, -0.56208287, -0.6944602 , -0.62829452]),\n",
       " 'split2_train_score': array([-0.69314718, -0.67906236, -0.69314718, -0.6447542 , -0.63684471,\n",
       "        -0.56659902, -0.45993859, -0.46138451, -0.41332802, -0.41712703,\n",
       "        -0.41001861, -0.41068317, -0.40973474, -0.40985638]),\n",
       " 'split3_test_score': array([-0.69314718, -0.67950855, -0.69314718, -0.6494701 , -0.63546417,\n",
       "        -0.59616347, -0.56507992, -0.56323015, -0.6904304 , -0.63784224,\n",
       "        -0.78963463, -0.7288596 , -0.88046155, -0.80703465]),\n",
       " 'split3_train_score': array([-0.69314718, -0.67872211, -0.69314718, -0.64231873, -0.62551085,\n",
       "        -0.55639969, -0.42691137, -0.43815996, -0.37663778, -0.38253917,\n",
       "        -0.37274099, -0.3736064 , -0.37243593, -0.37257258]),\n",
       " 'split4_test_score': array([-0.69314718, -0.67953279, -0.69314718, -0.64810189, -0.64086164,\n",
       "        -0.58550503, -0.49525037, -0.52877476, -0.54650408, -0.53590879,\n",
       "        -0.57029537, -0.5588753 , -0.59189228, -0.57486182]),\n",
       " 'split4_train_score': array([-0.69314718, -0.67870055, -0.69314718, -0.64315229, -0.64048444,\n",
       "        -0.56026255, -0.44876278, -0.4527948 , -0.4055655 , -0.40925948,\n",
       "        -0.40249091, -0.40304714, -0.40225992, -0.40235756]),\n",
       " 'std_fit_time': array([4.86212102e-03, 1.98256275e-04, 1.70262251e-05, 7.65490142e-05,\n",
       "        9.45113930e-04, 7.37884510e-05, 4.08485757e-04, 9.10075166e-05,\n",
       "        3.54383369e-03, 2.64317052e-04, 1.74118628e-02, 1.48037442e-04,\n",
       "        1.11707755e-01, 3.89514513e-04]),\n",
       " 'std_score_time': array([9.18916796e-05, 1.50541727e-04, 2.91976235e-05, 2.27313830e-05,\n",
       "        1.82389596e-04, 2.15352035e-05, 1.35738664e-04, 3.60381650e-05,\n",
       "        5.15764140e-05, 1.53525349e-04, 1.83951638e-04, 8.38581016e-05,\n",
       "        2.02801854e-04, 3.96367285e-05]),\n",
       " 'std_test_score': array([0.        , 0.00030277, 0.        , 0.00202301, 0.00331524,\n",
       "        0.01081986, 0.04338512, 0.03281659, 0.08980071, 0.06525591,\n",
       "        0.1214696 , 0.09805687, 0.15249229, 0.12622639]),\n",
       " 'std_train_score': array([0.        , 0.00019482, 0.        , 0.00114614, 0.00768128,\n",
       "        0.00498357, 0.01311504, 0.01015955, 0.01494333, 0.01406485,\n",
       "        0.01519515, 0.01511198, 0.01520433, 0.01519848])}"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')\n",
    "grid.fit(x_train,y_train)\n",
    "\n",
    "grid.cv_results_\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5080987178331886\n",
      "{'penalty': 'l1', 'C': 1}\n"
     ]
    }
   ],
   "source": [
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1b30a5b790>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#pd.DataFrame(grid.cv_results_).to_csv('LogisticGridSearchCV_Otto.csv')\n",
    "#cvresult = pd.DataFrame.from_csv('LogisticGridSearchCV_Otto.csv')\n",
    "#test_means = cv_results['mean_test_score']\n",
    "#test_stds = cv_results['std_test_score'] \n",
    "#train_means = cvresult['mean_train_score']\n",
    "#train_stds = cvresult['std_train_score'] \n",
    "\n",
    "\n",
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'neg-logloss' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线性SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.84      0.88      0.86       107\n",
      "          1       0.69      0.62      0.65        47\n",
      "\n",
      "avg / total       0.79      0.80      0.80       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[94 13]\n",
      " [18 29]]\n"
     ]
    }
   ],
   "source": [
    "y_predict = SVC1.predict(x_test)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, classification_report(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % confusion_matrix(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, x_train, y_train, x_test, y_test):\n",
    "    \n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(x_train, y_train)\n",
    "    \n",
    "    accuracy = SVC2.score(x_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.772727272727\n",
      "accuracy: 0.785714285714\n",
      "accuracy: 0.798701298701\n",
      "accuracy: 0.798701298701\n",
      "accuracy: 0.785714285714\n",
      "accuracy: 0.746753246753\n",
      "accuracy: 0.74025974026\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xm8lHXZx/HPxSYqqMjidpAlSUVFzCMuiAiaoSnkkoFaLqktimVZ4ZIoaFpq9rjkUk9qPT7yuKGmJJIziAQqB1lkkSVMORJBIioKInA9f/zmxAgHZs7h3Oc3y/f9es2LWe57zhf0zDX3bzV3R0REZGuaxA4gIiKFT8VCRERyUrEQEZGcVCxERCQnFQsREclJxUJERHJSsRARkZxULEREJCcVCxERyalZ7AANpV27dt65c+fYMUREisrUqVP/7e7tcx1XMsWic+fOVFVVxY4hIlJUzOztfI5TM5SIiOSkYiEiIjklWizMbICZzTOzhWY2rJbX9zaztJlNM7OZZnZS1mtXZs6bZ2ZfSTKniIhsXWJ9FmbWFLgb+DJQDUwxs2fcfU7WYdcAj7r7PWbWHRgDdM7cHwwcAOwJ/NXMvuju65PKKyJS7D777DOqq6tZs2bNZq+1bNmSiooKmjdvXq/3TrKDuxew0N0XAZjZKGAQkF0sHNgpc39nYEnm/iBglLt/CrxlZgsz7zc5wbwiIkWturqa1q1b07lzZ8zsP8+7O++99x7V1dV06dKlXu+dZDPUXsDirMfVmeeyXQecY2bVhKuKoXU4V0REsqxZs4a2bdt+rlAAmBlt27at9YojX0kWC6vluU235RsCPOjuFcBJwJ/MrEme52JmF5tZlZlVLV++fJsDi4gUu00LRa7n85VkM1Q10DHrcQUbm5lqfBsYAODuk82sJdAuz3Nx9/uB+wEqKyu1P6wUnPXr4eGHYeHC2Elq178/HHts7BRSDJIsFlOAbmbWBXiX0GF91ibHvAMcBzxoZvsDLYHlwDPA/5rZrwkd3N2A1xLMKtLg5s6FCy+ESZPC4238Ytfg3GHkSLjgArjtNthll9iJpJAl1gzl7uuAS4GxwFzCqKfZZjbCzAZmDvsxcJGZzQAeAc7zYDbwKKEz/HngEo2EkmLx2Wdw443Qsye8+Sb86U+wYUPh3T75BIYNg4cegu7d4amnYv/LSUNwr72RZUvP58u29Q0KRWVlpWu5D4nt9dfDN/UZM+DMM+HOO6FDh9iptm7qVPj2t0Pmr389ZN5tt9ippD7eeustWrduvVknd81oqI8++miz0VBmNtXdK3O9d8msDSUS0+rVcP31cOutoTiMHg1f+1rsVPk59FCYMgVuuSX8HV58EX7zGzjnnMJrOpOtq6iooLq6mtoG/NTMs6gvXVmIbKMJE0LfxIIF4Rv6rbcWb/v/3Lnh7zB5Mpx4Itx7L+y9d+xUkqR8ryy0NpRIPX34IVxyCfTtC+vWwV//Cr//ffEWCoD994eXX4Y77ghF8IAD4Le/DX0cUt5ULETq4S9/gQMPhHvugR/+EN54A447LnaqhtG0KQwdCrNmwZFHbiyI8+bFTiYxqViI1MF778G3vgUnnQStW4dhsbffDjvuGDtZw+vcGcaOhQceCIXj4IPh5pvDVZSUHxULkTy4w6OPhmaaRx6Bn/88jHw64ojYyZJlBuedF/oyvvpVuPJKOPxwmD49djJpbCoWIjksWQKnngrf+AZ06hSGmo4YAdttFztZ49l9d3jiCXj8cXj3XaishKuvhm1YakiKjIqFyBa4w3//d5iwNnZsGFo6eTL06BE7WTynnw5z5oRhtb/4BRxyyMYZ6lLaVCxEarFoERx/fBgS27Nn6MC+4gpopplJ7LorPPggPP98mAV+9NFw2WWwalXsZJIkFQuRLOvXhwlpBx0UJqrdey+kUrDPPrGTFZ6vfCV0fF9yCdx1Vxgd9sILsVNJUlQsRDJmz4beveHyy6Ffv9Dc8p3vQBP9lmxR69ZheZCXX4aWLUMBOf98WLEidjJpaPo1kLK3dm1YffWQQ8JS4g8/DH/+M2zDyghlp3fvMELqqqvCwondu4cOcSkdKhZS1qZMCSN7rr02dN7OnQtnnaU1keqjZcuw2m5VFey5J5xxRrgtXRo7mTQEFQspS598Aj/5SZgn8d578PTTYf5E+/axkxW/nj3h1Vfhppvg2WfDVcaDD4bRZVK8VCyk7IwfH2Yj33prWDRvzhwYODDnaVIHzZuHvTJmzAjrS51/PgwYAP/4R+xkUl8qFlI2PvgAvvvd0Hm9YUNYivv++2HnnWMnK1377gsvvRRGS02aFEZM3XmnFiYsRioWUhaeey58w/3d7+DHPw7zJvr3j52qPDRpEobXzpq1cU7GMceEXQSleKhYSElbvhzOPhtOPhnatAkzsG+9FXbYIXay8tOpU1it96GHwkCCgw8Os8A/+yx2MsmHioWUJHcYNSp0rj72GFx3XVjTqVev2MnKm1lYtXfOHBg0KKwv1asXTJsWO5nkomIhJae6OnwQDRkCXbuG1WGHD4cWLWInkxq77RZW8X3yyTC09rDDwoq2q1fHTiZbomIhJWPDhtBhfcABYde6227b2KkqhenUU8NVxrnnhr0yevaEiRNjp5LaqFhISVi4MCz8953vwKGHhg7sH/0o7Pomha1Nm7C677hxYTZ9nz6hX0kKi4qFFLX168MVRI8eoU/ivvvCkNgvfCF2Mqmr448PRf6UU8LmUkuWxE4k2VQspGjV7BF9xRXhg2bOHLj4Yi3VUcxatQqr/q5bF0ZKSeFQsZCis3ZtGN30pS/BW2+FZTqefhr22it2MmkIXbvCBReE/qe3346dRmqoWEhRefXVUCSuvx7OPDOM1x88WFcTpeaaa8J/0xtuiJ1EaqhYSFH4+OPQYX3kkWHZjmefhf/5H2jXLnYySULHjqFJ8YEHwuAFiU/FQgpeKhU6sG+/PYx2mj0bvvrV2KkkaVddFRYkHDEidhIBFQspYCtXwkUXwXHHhfWFxo+He+6BnXaKnUwawx57hDWlHn44NDdKXIkWCzMbYGbzzGyhmQ2r5fXbzWx65jbfzFZmvfYrM5ttZnPN7A4ztUqXk2eeCZPr/vCHsO/EjBnQt2/sVNLYfvYz2H77MKBB4kqsWJhZU+Bu4ESgOzDEzLpnH+Pul7t7T3fvCdwJPJk59yigN9ADOBA4DNBHRRlYtix0WA8aBG3bhg7tX/1KC/+Vq/bt4Qc/CEuDzJwZO015S/LKohew0N0XuftaYBQwaCvHDwEeydx3oCXQAtgOaA78K8GsEpl7aG7o3h1Gjw57YldVhS1Ppbz9+Meh6XH48NhJyluSxWIvYHHW4+rMc5sxs05AFyAF4O6TgTTwz8xtrLur1bJELV4clhA/5xzo1i2sQHrNNVr4T4Jddw0F46mnwhcIiSPJYlFbH8OWduEdDDzu7usBzGwfYH+gglBg+pvZMZv9ALOLzazKzKqWL1/eQLGlsWzYEDqsDzggdF7/5jdhEbnu3XOeKmXmhz8MRePaa2MnKV9JFotqoGPW4wpgS6u9DGZjExTAqcAr7r7K3VcBfwGO2PQkd7/f3SvdvbJ9+/YNFFsaw4IFYXvT738/7GfwxhuhbVoL/0ltdtoJfvrTsHnSpEmx05SnJIvFFKCbmXUxsxaEgvDMpgeZ2b5AG2By1tPvAH3NrJmZNSd0bqsZqgSsWxc6rHv0CCOcalYb7do1djIpdJdeCh06hEUGpfElVizcfR1wKTCW8EH/qLvPNrMRZjYw69AhwCh3z26iehz4O/AGMAOY4e5/TiqrNI4ZM+CII8JwyAEDwsJ/F1ygpTokPzvuCMOGhUma6XTsNOXHPv8ZXbwqKyu9Sr1fBenTT8MaPzffHNqd77oLzjhDRULqbvVq2Gcf6NIFXn5Z/w81BDOb6u45xx1qBrckavJkOOSQUCzOOitcTXz96/oll/rZfvuwb/ff/gYvvBA7TXlRsZBErFoVRrD07h3ujxkDDz0UJtqJbItvfxs6dQp9FyXSMFIUVCykwY0bBwcdBP/1X2G00+zZcOKJsVNJqdhuu1AopkyBP6sns9GoWEiDef/98K3vhBPCaqETJoT+idatYyeTUvOtb4Wtc6+9NszXkeSpWEiDGD06TKZ76KEwYmXGDOjTJ3YqKVXNm4fFBWfMgCeeiJ2mPKhYyDZZujR0WJ92Guy+O7z2Gtx0U+iIFEnSkCGw//5hzaj162OnKX0qFlIv7vDHP4ariWeegRtvDIXiS1+KnUzKRdOmYXvduXNh1KjYaUqfioXU2dtvhw7rc88N3+xmzNi4q5lIYzr99LAawHXXhdUBJDkqFlIna9eGWdgTJ8Idd4SJUfvtFzuVlKsmTcK2qwsXhitdSY6KhdTJa6+FfooHHoChQ8Mvq0hMAweGfU9GjAhfZiQZ+lWXOkmlwuzr/v1jJxEJzMJmWW+/HRamlGSoWEidpNPQs6dmYkth+cpXwmoBN9wQ1o+ShqdiIXlbvTrsJaCrCik0NVcXS5bAfffFTlOaVCwkb5MmhTbhfv1iJxHZXL9+4XbTTfDxx7HTlB4VC8lbOh3GtmtmthSqkSNh2TK4++7YSUqPioXkLZWCww4LW1yKFKLevcPGWr/8JXz4Yew0pUXFQvLy0Udh2KyaoKTQjRwJK1aEVY+l4ahYSF4mTgzr76hzWwpdZSUMGgS33RZWQpaGoWIheUmloEULOOqo2ElEchsxAj74IBQMaRgqFpKXVCos87HDDrGTiOTWoweceWZoilq+PHaa0qBiITm9/z5Mm6YmKCku110Hn3wCv/pV7CSlQcVCcnrppbAkuYqFFJP994ezzw7DaJcujZ2m+KlYSE6pVNjM6PDDYycRqZtrrw0TSW+6KXaS4qdiITmlUnD00aGDW6SY7LMPnHce3HsvLF4cO01xU7GQrfrXv2D2bDVBSfH6+c9DM+qNN8ZOUtxULGSrxo8Pf6pYSLHq1AkuuigsX75oUew0xUvFQrYqlYLWrbW3thS3q6+GZs3C7G6pHxUL2ap0Gvr2Db9oIsVqzz3he98LW6/Onx87TXFSsZAtWrwYFixQE5SUhmHDoGXLMP9C6i7RYmFmA8xsnpktNLNhtbx+u5lNz9zmm9nKrNf2NrMXzGyumc0xs85JZpXNpdPhTy0eKKWgQwe47DIYNQpmzYqdpvgkVizMrClwN3Ai0B0YYmbds49x98vdvae79wTuBJ7MevmPwC3uvj/QC1iWVFapXToNu+4alk4QKQVXXAGtWsHw4bGTFJ8kryx6AQvdfZG7rwVGAYO2cvwQ4BGATFFp5u7jANx9lbt/kmBW2YR76Nzu1w+aqLFSSkTbtvCjH8GTT4YlbCR/SX4M7AVkT4Opzjy3GTPrBHQBUpmnvgisNLMnzWyamd2SuVKRRrJoEbzzjpqgpPRcfjm0aRNmd0v+kiwWVstzvoVjBwOPu/v6zONmQB/gCuAwoCtw3mY/wOxiM6sys6rlWlqyQdX0V6hzW0rNzjuH5qhnn4VXXomdpngkWSyqgY5ZjyuAJVs4djCZJqisc6dlmrDWAU8Bm430d/f73b3S3Svbt2/fQLEFQhPU7rvDfvvFTiLS8C67DNq109VFXSRZLKYA3cysi5m1IBSEZzY9yMz2BdoAkzc5t42Z1VSA/sCcBLNKlpr+iv79wWq7PhQpcq1ahaG048bBhAmx0xSHxIpF5orgUmAsMBd41N1nm9kIMxuYdegQYJS7e9a56wlNUC+a2RuEJq3fJZVVPm/u3LAmlPorpJR973uwxx4b146SrUt0Xq67jwHGbPLctZs8vm4L544DNGgzAvVXSDnYYQe46ioYOhRefBGOPz52osKW15WFmT1hZl81Mw2iLAOpVFh8rUuX2ElEknXRRdCxI1xzja4ucsn3w/8e4CxggZndbGbq9ixRGzaElWb79VN/hZS+7bYLzVCvvgpjxuQ+vpzlVSzc/a/ufjZhRNI/gHFmNsnMzjez5kkGlMY1cyasWKEmKCkf550HXbuq7yKXvJuVzKwtYa7DhcA04L8IxWNcIskkilRmWqQ6t6VcNG8elv+YNg1Gj46dpnDl22fxJPAysANwirsPdPf/c/ehQKskA0rjSqWgWzeoqIidRKTxnH027LtvmHexfn3u48tRvlcWd7l7d3e/yd3/mf2Cu1cmkEsiWLcujDlXE5SUm6ZNw9Lls2fDo4/GTlOY8i0W+5vZLjUPzKyNmX0/oUwSydSp8NFHKhZSns48Ew48MBSNdetipyk8+RaLi9z9P3tNuPv7wEXJRJJYavorjj02agyRKJo0gREjwk56Dz8cO03hybdYNDHbOJAyswJsi2QiSSzpdPhm1aFD7CQicXzta2G/+euvh88+i52msORbLMYCj5rZcWbWn7Do3/PJxZLG9umnMHGimqCkvJnByJHw1lvwwAOx0xSWfIvFzwh7TXwPuAR4EfhpUqGk8b36KqxerWIhcuKJcMQRoWisWRM7TeHId1LeBne/x93PcPfT3f2+rL0npASkUuFb1THHxE4iEpcZ3HADVFfD77R86X/kO8+im5k9bmZzzGxRzS3pcNJ40unQVtumTewkIvH17w99+8IvfgGfaENnIP9mqAcI60OtA/oBfwT+lFQoaVyffAKTJ6sJSqRGTd/F0qXw29/GTlMY8i0W27v7i4C5+9uZZcX10VIi/va3MPJDS3yIbNSnD5xwAvzyl2H+UbnLt1isySxPvsDMLjWzUwENsCwR6TQ0awZHHx07iUhhGTkS/v1vuPPO2Eniy7dY/JCwLtRlwKHAOcC5SYWSxpVKQa9e0Lp17CQihaVXLzjlFLjlFli5MvfxpSxnschMwDvT3Ve5e7W7n58ZEfVKI+SThH34IVRVqb9CZEtGjAiF4vbbYyeJK2exyAyRPTR7BreUjpdfDqtsqr9CpHY9e8IZZ4Ri8d57sdPEk28z1DTgaTP7ppmdVnNLMpg0jlQq7BZ25JGxk4gUruuug1Wr4MIL4ZVXwo6S5SbfYrEr8B5hBNQpmdvJSYWSxpNKwVFHwfbbx04iUrgOOACuugqeey58sdp7b7jsMnjppfLZ/8K8RPYRrKys9Kqqqtgxisp770H79mHRtJ//PHYakcK3ciU8+yw88QQ8/3xYDqRDh7AA4emnh+bc5kW20bSZTc1nX6Jmeb7ZA8BmVcXdL6hHNikQL70U9hxW57ZIfnbZBc45J9xWrYIxY0LhePhhuP/+sALCoEGhcHz5y6GJt1TkVSyAZ7PutwROBZY0fBxpTKkU7LgjHHZY7CQixadVq7Bh0plnhkU4X3ghFI7Ro+HBB8NQ9JNPDoXjxBNhhx1iJ9429WqGykzQ+6u7F8x3UjVD1V337qHt9XktNi/SYNauDV/EHn8cnnoqNPduv30oGKefHgrITjvFTrlRvs1Q+XZwb6obsHc9z5UCsHQpzJ2rJiiRhtaiBQwYAL//ffg9e/FFOP98mDQJzj479BOeckq4+lixInba/OW76uxHZvZhzQ34M2GPCylS6XT4U8VCJDnNmoXfsbvvhnffDRuMXXIJzJwZCshuu4X1p+67D/71r9hpt06jocrURRfBY4+FS+SmTWOnESkv7mHlhCeeCLeFC8Me4H36hKaq006DvfZqnCwN2gxlZqea2c5Zj3cxs69tS0CJK50O6/WrUIg0PrMwsOTmm2H+fJgxA665JixaeNllUFER5nPcemvY4rUQ5NtnMdzdP6h54O4rgeG5TjKzAWY2z8wWmtmwWl6/3cymZ27zzWzlJq/vZGbvmtldeeaUPLz9Nvz972qCEikEZtCjR5jvNGtW6Eu84Qb49FP4yU+ga9ewMdkvfgHz5sXLmW+xqO24rQ67zSxAeDdwItAdGGJm3bOPcffL3b2nu/cE7gSe3ORtRgIv5ZlR8qT+CpHCtd9+cPXV8Prr4UvdLbeE+RpXXx1eO/BAGD489Hs0Zi9CvsWiysx+bWZfMLOuZnY7MDXHOb2Ahe6+yN3XAqOAQVs5fgjwSM0DMzsU2A14Ic+Mkqd0Gtq1C0sYiEjh6toVrrgi7GS5eDHccQe0bRv22Tj4YPjiF2HYsND/kbR8i8VQYC3wf8CjwGrgkhzn7AUsznpcnXluM2bWCegCpDKPmwC3AT/JM5/kyT2MAe/XL3SoiUhxqKiAoUPDygv//Cfcey906RL6Nb773eR/fl4zuN39Y2CzPoccalvSfEsXTYOBxzPLoQN8Hxjj7ou3tjK6mV0MXAyw996a9pGPhQuhulpNUCLFbLfd4DvfCbcVK8Kw3KTlOxpqnJntkvW4jZmNzXFaNdAx63EFW14iZDBZTVDAkcClZvYP4FbgW2Z286Ynufv97l7p7pXt27fP428iNf0V2r9CpDTsuiscdFDyPyfftaHaZUZAAeDu75tZrj24pwDdzKwL8C6hIJy16UFmti/QBpic9f5nZ71+HlDp7nW9spFapFKw556hrVNEJF/5tlpvMLP/tPOYWWe23KQEgLuvAy4FxgJzgUfdfbaZjTCzgVmHDgFGeanMDixg7uHKon//MFxPRCRf+V5ZXA1MNLOaYazHkOkr2Bp3HwOM2eS5azd5fF2O93gQeDDPnLIVc+bAsmVqghKRusu3g/t5M6skFIjpwNOEEVFSRFKp8Kc6t0WkrvLd/OhC4AeETurpwBGEPgZ97BSRVCoMtevcOXYSESk2+fZZ/AA4DHjb3fsBhwDLE0slDW79ehg/XlcVIlI/+RaLNe6+BsDMtnP3N4F9k4slDW3GjLB/sPorRKQ+8u3grs7Ms3gKGGdm76NtVYtKTX+FioWI1Ee+HdynZu5eZ2ZpYGdAm3EWkVQqLEK2556xk4hIMcr3yuI/3F2rwBaZzz6Dl1+Gb34zdhIRKVZaSq4MVFXBqlXq3BaR+lOxKAM1/RXHHhs1hogUMRWLMpBOh5242rWLnUREipWKRYlbswb+9jc1QYnItlGxKHGvvBIKhoqFiGwLFYsSl06HHfGOOSZ2EhEpZioWJS6VgkMPhZ13jp1ERIqZikUJ+/jj0AylJigR2VYqFiVs4kRYt07FQkS2nYpFCUunoXlz6N07dhIRKXYqFiUslYLDD4cdd4ydRESKnYpFifrgA5g6VU1QItIwVCxK1IQJsGGDliQXkYahYlGiUilo2RKOOCJ2EhEpBSoWJSqVCh3bLVvGTiIipUDFogT9+98wc6aaoESk4ahYlKDx48Of6twWkYaiYlGCUilo1QoqK2MnEZFSoWJRgtLpsHBg8+axk4hIqVCxKDFLlsCbb6q/QkQalopFiUmnw5/qrxCRhqRiUWJSKWjTBg4+OHYSESkliRYLMxtgZvPMbKGZDavl9dvNbHrmNt/MVmae72lmk81stpnNNLNvJJmzlKTT0LcvNG0aO4mIlJJmSb2xmTUF7ga+DFQDU8zsGXefU3OMu1+edfxQ4JDMw0+Ab7n7AjPbE5hqZmPdfWVSeUvBW2+F2+WX5z5WRKQukryy6AUsdPdF7r4WGAUM2srxQ4BHANx9vrsvyNxfAiwD2ieYtSSov0JEkpJksdgLWJz1uDrz3GbMrBPQBUjV8lovoAXw9wQylpR0Gjp0gO7dYycRkVKTZLGwWp7zLRw7GHjc3dd/7g3M9gD+BJzv7hs2+wFmF5tZlZlVLV++fJsDFzP30Lndrx9Ybf/yIiLbIMliUQ10zHpcASzZwrGDyTRB1TCznYDngGvc/ZXaTnL3+9290t0r27cv71aq+fPDHAs1QYlIEpIsFlOAbmbWxcxaEArCM5seZGb7Am2AyVnPtQBGA39098cSzFgyavorNBlPRJKQWLFw93XApcBYYC7wqLvPNrMRZjYw69AhwCh3z26iOhM4Bjgva2htz6SyloJUCioqYJ99YicRkVJkn/+MLl6VlZVeVVUVO0YUGzbAbrvBSSfBQw/FTiMixcTMprp7zmVHNYO7BMyeHfawUH+FiCRFxaIEpDIDjtVfISJJUbEoAakUfOELsPfesZOISKlSsShy69fDSy+pCUpEkqViUeSmTYMPPlATlIgkS8WiyKm/QkQag4pFkUulwlpQu+8eO4mIlDIViyK2di1MnKirChFJnopFEZsyBT7+WJ3bIpI8FYsilkqFFWb79o2dRERKnYpFEUunoWdPaNs2dhIRKXUqFkVq9WqYNEn9FSLSOFQsitTkyfDpp+qvEJHGoWJRpNJpaNoU+vSJnUREyoGKRZFKpaCyEnbaKXYSESkHKhZFaNUqeO01NUGJSONRsShCEyfCunUqFiLSeFQsilAqBc2bw1FHxU4iIuVCxaIIpVJw5JGwww6xk4hIuVCxKDLvvw+vv64mKBFpXCoWRWbCBHBXsRCRxqViUWRSKdh+e+jVK3YSESknKhZFJpWCo4+G7baLnUREyomKRRFZtgxmzVITlIg0PhWLIjJ+fPhTiweKSGNTsSgiqRS0bg2HHho7iYiUGxWLIpJOh42OmjWLnUREyo2KRZGorob589UEJSJxqFgUiXQ6/KnObRGJIdFiYWYDzGyemS00s2G1vH67mU3P3Oab2cqs1841swWZ27lJ5iwG6TTsuiv06BE7iYiUo8Rav82sKXA38GWgGphiZs+4+5yaY9z98qzjhwKHZO7vCgwHKgEHpmbOfT+pvIXMHV58EY49FproWlBEIkjyo6cXsNDdF7n7WmAUMGgrxw8BHsnc/wowzt1XZArEOGBAglkL2ltvwTvvqAlKROJJsljsBSzOelydeW4zZtYJ6AKk6npuOUhl/lVULEQkliSLhdXynG/h2MHA4+6+vi7nmtnFZlZlZlXLly+vZ8zCl07D7rvDfvvFTiIi5SrJYlENdMx6XAEs2cKxg9nYBJX3ue5+v7tXuntl+/bttzFuYXIPVxb9+oHVVkJFRBpBksViCtDNzLqYWQtCQXhm04PMbF+gDTA56+mxwAlm1sbM2gAnZJ4rO2++CUuXqglKROJKbDSUu68zs0sJH/JNgT+4+2wzGwFUuXtN4RgCjHJ3zzp3hZmNJBQcgBHuviKprIVM8ytEpBBY1md0UausrPSqqqrYMRrcGWfAlCnwj3+oGUpEGp6ZTXX3ylzHadR+AduwIVxZ9O+vQiEicalYFLC00NUvAAAGTUlEQVQ33oAVK9QEJSLxqVgUsJr5FVo8UERiU7EoYKkUdOsGFRWxk4hIuSv7nRFWrIA+fWKnqN2CBXDBBbFTiIioWNC0KXTvHjtF7Q46CC65JHYKEREVC3beGR57LHYKEZHCpj4LERHJScVCRERyUrEQEZGcVCxERCQnFQsREclJxUJERHJSsRARkZxULEREJKeS2c/CzJYDb2/DW7QD/t1AcRqSctWNctWNctVNKebq5O4596UumWKxrcysKp8NQBqbctWNctWNctVNOedSM5SIiOSkYiEiIjmpWGx0f+wAW6BcdaNcdaNcdVO2udRnISIiOenKQkREclKx2ISZXWFmbmbtYmepYWYjzWymmU03sxfMbM8CyHSLmb2ZyTXazHaJnamGmX3dzGab2QYzizpyxcwGmNk8M1toZsNiZslmZn8ws2VmNit2lmxm1tHM0mY2N/Pf8AexMwGYWUsze83MZmRyXR87Uw0za2pm08zs2SR/jopFFjPrCHwZeCd2lk3c4u493L0n8CxwbexAwDjgQHfvAcwHroycJ9ss4DRgQswQZtYUuBs4EegODDGzQtmX8UFgQOwQtVgH/Njd9weOAC4pkH+zT4H+7n4w0BMYYGZHRM5U4wfA3KR/iIrF590O/BQoqI4cd/8w6+GOFEA+d3/B3ddlHr4CVMTMk83d57r7vNg5gF7AQndf5O5rgVHAoMiZAHD3CcCK2Dk25e7/dPfXM/c/InwI7hU3FXiwKvOweeYW/ffQzCqArwK/T/pnqVhkmNlA4F13nxE7S23M7EYzWwycTWFcWWS7APhL7BAFaC9gcdbjagrgg69YmFln4BDg1bhJgkxzz3RgGTDO3Qsh128IX3A3JP2DymoPbjP7K7B7LS9dDVwFnNC4iTbaWjZ3f9rdrwauNrMrgUuB4bEzZY65mtB08HDSeeqarQBYLc9F/zZaDMysFfAE8MNNrqyjcff1QM9M/9xoMzvQ3aP1+ZjZycAyd59qZscm/fPKqli4+/G1PW9mBwFdgBlmBqFJ5XUz6+XuS2Nmq8X/As/RCMUiVyYzOxc4GTjOG3kMdh3+vWKqBjpmPa4AlkTKUjTMrDmhUDzs7k/GzrMpd19pZuMJfT4xBwj0Bgaa2UlAS2AnM/sfdz8niR+mZijA3d9w9w7u3tndOxN+yb/UWIUiFzPrlvVwIPBmrCw1zGwA8DNgoLt/EjtPgZoCdDOzLmbWAhgMPBM5U0Gz8G3tv4G57v7r2HlqmFn7mhF/ZrY9cDyRfw/d/Up3r8h8Zg0GUkkVClCxKBY3m9ksM5tJaCorhOGEdwGtgXGZIb33xg5Uw8xONbNq4EjgOTMbGyNHZgDApcBYQkfto+4+O0aWTZnZI8BkYF8zqzazb8fOlNEb+CbQP/P/1fTMN+fY9gDSmd/BKYQ+i0SHqhYazeAWEZGcdGUhIiI5qViIiEhOKhYiIpKTioWIiOSkYiEiIjmpWIjUgZmtyn3UVs9/3My6Zu63MrP7zOzvmZVMJ5jZ4WbWInO/rCbNSmFTsRBpJGZ2ANDU3Rdlnvo9YTG/bu5+AHAe0C6z6OCLwDeiBBWphYqFSD1YcEtmsuQbZvaNzPNNzOy3mSuFZ81sjJmdkTntbKBmTa0vAIcD17j7BoDM6rTPZY59KnO8SEHQZa5I/ZxG2NfgYKAdMMXMJhBmIHcGDgI6EGZu/yFzTm/gkcz9A4DpmcXpajMLOCyR5CL1oCsLkfo5GnjE3de7+7+Alwgf7kcDj7n7hszaYumsc/YAlufz5pkistbMWjdwbpF6UbEQqZ/alh/f2vMAqwmrgwLMBg42s639Dm4HrKlHNpEGp2IhUj8TgG9kNsRpDxwDvAZMBE7P9F3sBhybdc5cYB8Ad/87UAVcn1lpFTPrZmaDMvfbAsvd/bPG+guJbI2KhUj9jAZmAjOAFPDTTLPTE4Ql7mcB9xF2efsgc85zfL54XEjYwGmhmb0B/I6N+130A8Yk+1cQyZ9WnRVpYGbWyt1XZa4OXgN6u/vSzD4I6czjLXVs17zHk8CVBbKXuIhGQ4kk4NnMRjktgJE1m2i5+2ozG07Yh/udLZ2c2SjpKRUKKSS6shARkZzUZyEiIjmpWIiISE4qFiIikpOKhYiI5KRiISIiOalYiIhITv8PbT3o+k/olAQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1b25b81210>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "C_s = np.logspace(-4, 4, 9)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "\n",
    "    tmp = fit_grid_point_Linear(oneC, x_train, y_train, x_test, y_test)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()\n",
    "  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将-3～3划分为5，7,9，11等分，最后得到较好的正则参数为C=10或1，最佳精度约为0.798，相比与Logistic回归效果更好，考虑存在样本分布不均，由于SVM与样本类别的分类是否均衡关系不大，因此效果更优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RBF核SVM正则参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, x_train, y_train, x_test, y_test):\n",
    "    \n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(x_train, y_train)\n",
    "    \n",
    "    accuracy = SVC3.score(x_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.798701298701\n",
      "accuracy: 0.675324675325\n",
      "accuracy: 0.668831168831\n",
      "accuracy: 0.811688311688\n",
      "accuracy: 0.779220779221\n",
      "accuracy: 0.714285714286\n",
      "accuracy: 0.662337662338\n",
      "accuracy: 0.785714285714\n",
      "accuracy: 0.74025974026\n",
      "accuracy: 0.714285714286\n",
      "accuracy: 0.662337662338\n"
     ]
    }
   ],
   "source": [
    "C_s = np.logspace(-1, 2, 4)\n",
    "gamma_s = np.logspace(-2, 1, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, x_train, y_train, x_test, y_test)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1b258d2910>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "参数调优之后达到的精度约为0.81，正则参数为C=10，gamma值为0.01"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
